package br.com.unip.menudroidweb.facade;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;

import org.codehaus.jettison.json.JSONArray;
import org.codehaus.jettison.json.JSONObject;

import br.com.unip.menudroidweb.dao.DispositivoDAO;
import br.com.unip.menudroidweb.dao.FormaPagamentoDAO;
import br.com.unip.menudroidweb.dao.PedidoDAO;
import br.com.unip.menudroidweb.dao.ProdutoDAO;
import br.com.unip.menudroidweb.model.Dispositivo;
import br.com.unip.menudroidweb.model.FormaPagamento;
import br.com.unip.menudroidweb.model.ItemPedido;
import br.com.unip.menudroidweb.model.Pedido;
import br.com.unip.menudroidweb.model.Produto;

import com.google.gson.Gson;

@Path("/pedido")
public class PedidoFacade implements Serializable {

	private static final long serialVersionUID = 1189380336309409902L;
	private PedidoDAO pedidoDAO = new PedidoDAO();
	private ProdutoDAO produtoDAO = new ProdutoDAO();
	private DispositivoDAO dispositivoDAO = new DispositivoDAO();
	private FormaPagamentoDAO formaPagamentoDAO = new FormaPagamentoDAO();
	private Produto produto = new Produto();
	private Dispositivo dispositivo;
	private FormaPagamento formaPagamento = new FormaPagamento();
	private Pedido pedido;

	@POST
	@Path("/inserir")
	@Consumes("application/json")
	public void createPedido(String stringJson) {
		try {
			ArrayList<ItemPedido> listaItemPedido = new ArrayList<ItemPedido>();

			JSONObject json = new JSONObject(stringJson);
			JSONArray pedidoProduto = json.getJSONArray("pedidoProduto");

			dispositivoDAO.beginTransaction();
			dispositivo = dispositivoDAO.findDispositivoByIMEI(json.getString("IMEI"));
			dispositivoDAO.closeTransaction();

			formaPagamentoDAO.beginTransaction();
			this.formaPagamento = formaPagamentoDAO.find(json.getInt("idFormaPagamento"));
			formaPagamentoDAO.closeTransaction();

			getPedido().setFormaPagamento(formaPagamento);
			getPedido().setDispositivo(dispositivo);
			getPedido().setTotal(json.getDouble("total"));
			Date data = new Date();
			getPedido().setDataPedido(new java.sql.Date(data.getTime()));

			for (int i = 0; i < pedidoProduto.length(); i++) {
				JSONObject j = pedidoProduto.getJSONObject(i);
				ItemPedido itemPedido = new ItemPedido();

				produtoDAO.beginTransaction();
				produto = produtoDAO.find(j.getInt("idProduto"));
				produtoDAO.closeTransaction();

				itemPedido.setObservacao(j.getString("observacao"));
				itemPedido.setValor(j.getDouble("valor"));
				itemPedido.setQuantidade(j.getInt("quantidade"));
				itemPedido.setIdProduto(this.produto);
				itemPedido.setPedido(pedido);

				listaItemPedido.add(itemPedido);
			}

			pedido.setItensPedido(listaItemPedido);
		} catch (Exception e) {
			e.printStackTrace();
		}

		pedidoDAO.beginTransaction();
		pedidoDAO.save(this.pedido);
		pedidoDAO.commitAndCloseTransaction();
	}

	@GET
	@Path("/listar/{id}")
	@Produces("application/json")
	public String listarPedidoAndroid(@PathParam("id") int pedidoId) {
		pedidoDAO.beginTransaction();
		Pedido pedido = pedidoDAO.find(pedidoId);
		pedidoDAO.closeTransaction();
		return new Gson().toJson(pedido);
	}

	@GET
	@Path("/listar")
	@Produces("application/json")
	public String listarTodosAndroid() {
		pedidoDAO.beginTransaction();
		ArrayList<Pedido> pedido = (ArrayList<Pedido>) pedidoDAO.findAll();
		pedidoDAO.closeTransaction();
		return new Gson().toJson(pedido);
	}



	public List<Pedido> listAll() {
		pedidoDAO.beginTransaction();
		List<Pedido> pedido = pedidoDAO.findAll();
		pedidoDAO.closeTransaction();
		return pedido;
	}
	
	public List<Pedido> listarPedidoFinalizado(boolean finalizado){
		pedidoDAO.beginTransaction();
		List<Pedido> pedido = pedidoDAO.findPedidoFinalizado(finalizado);
		pedidoDAO.closeTransaction();
		return pedido;
	}
	
	public void updatePedido(Pedido pedido){
		pedidoDAO.beginTransaction();
		Pedido persistedPedido = pedidoDAO.find(pedido.getIdPedido());
		persistedPedido.setFinalizado(pedido.isFinalizado());
		pedidoDAO.update(persistedPedido);
		pedidoDAO.commitAndCloseTransaction();
	}
	


	public Produto getProduto() {
		if (produto == null) {
			produto = new Produto();

		}

		return produto;
	}

	public void setProduto(Produto produto) {
		this.produto = produto;
	}

	public Dispositivo getDispositivo() {
		if (dispositivo == null) {
			dispositivo = new Dispositivo();

		}

		return dispositivo;
	}

	public void setDispositivo(Dispositivo dispositivo) {
		this.dispositivo = dispositivo;
	}

	public FormaPagamento getFormaPagamento() {
		if (formaPagamento == null) {
			formaPagamento = new FormaPagamento();

		}

		return formaPagamento;
	}

	public void setFormaPagamento(FormaPagamento formaPagamento) {
		this.formaPagamento = formaPagamento;
	}

	public Pedido getPedido() {
		if (pedido == null) {
			pedido = new Pedido();

		}
		return pedido;
	}

	public void setPedido(Pedido pedido) {
		this.pedido = pedido;
	}
}
